﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MvcCaja.Core.Interfaces;
using Chilis.Caja.Data.Models;

namespace MvcCaja.Core
{
    public class CuentaService : ICuentaService
    {
        public List<Cuenta> obtenerOrden(String sCodigoOrden)
        {
            ModelDataContext db = new ModelDataContext();

            return ( from n in db.Cuenta
                      where n.IdOrden.Equals(sCodigoOrden)
                      select n).ToList<Cuenta>();
        }

        public Cuenta obtener(String sCodigoOrden, int iNumeroCuenta)
        {
            ModelDataContext db = new ModelDataContext();

            return (from n in db.Cuenta
                    where n.IdOrden.Equals(sCodigoOrden) && n.NumeroCuenta.Equals(iNumeroCuenta)
                    select n).First();
        }

        public Orden obtenerDetalleOrdenSinCuenta(String CodigoOrden)
        {
            ModelDataContext db = new ModelDataContext();

            Orden ord =  (from n in db.Orden
                    where n.IdOrden.Equals(CodigoOrden)
                    select n).First();           
        
            var detalle = ord.DetalleOrden.Where(d => !db.DetalleCuenta.Any(c => c.IdOrden == d.IdOrden && c.IdProducto == d.IdProducto)).ToList();

            var entitySetDetalle = new System.Data.Linq.EntitySet<DetalleOrden>();
            entitySetDetalle.AddRange(detalle);

            ord.DetalleOrden = entitySetDetalle;

            return ord;
        }

   
        public List<Cliente> ObtenerClientes()
        {
            ModelDataContext db = new ModelDataContext();

            return (from c in db.Cliente where c.Nombres != string.Empty select c).ToList<Cliente>();
        }

        public void InsertarCuenta(string ordenId, int clienteId, string[] productos)
        {
            Cuenta cCuenta = new Cuenta();
            
            ModelDataContext db = new ModelDataContext();
            var cuenta = (from c in db.Cuenta where c.IdOrden == ordenId select c).OrderByDescending(x => x.NumeroCuenta).FirstOrDefault();

            int numCuenta = cuenta != null ? cuenta.NumeroCuenta + 1 : 1;

            List<DetalleOrden> ordenes = new List<DetalleOrden>();

            foreach (var producto in productos)
            {
                DetalleOrden orden = (from o in db.DetalleOrden where o.IdOrden == ordenId && o.IdProducto == producto select o).FirstOrDefault();
                ordenes.Add(orden);
            }

            decimal total = 0;

            foreach (var orden in ordenes)
            {
                total += orden.PrecioProducto * Convert.ToDecimal(orden.CantidadProducto);
            }

            //IdOrden, NumeroCuenta, IdCliente,fecha, subtotal, Impuestos, Total

            decimal impuesto = 0.18M;

            cCuenta.IdOrden = ordenId;
            cCuenta.NumeroCuenta = numCuenta;
            cCuenta.IdCliente = clienteId;
            cCuenta.FechaHoraCuenta = DateTime.Now;
            cCuenta.Total = total;
            cCuenta.Impuestos = Decimal.Multiply(total, impuesto);
            cCuenta.SubTotal = total - Decimal.Multiply(total, impuesto);

            db.Cuenta.InsertOnSubmit(cCuenta);
            db.SubmitChanges();

            //--IdOrden, numeroCuenta, IdProducto, CantidadProducto

            foreach (var orden in ordenes)
            {
                DetalleCuenta dDetalle = new DetalleCuenta();
                dDetalle.IdOrden = orden.IdOrden;
                dDetalle.NumeroCuenta = numCuenta;
                dDetalle.IdProducto = orden.IdProducto;
                dDetalle.CantidadProducto = Convert.ToInt32(orden.CantidadProducto);

                db.DetalleCuenta.InsertOnSubmit(dDetalle);
                db.SubmitChanges();
            }
        
        }

        public void Eliminar(String sCodigoOrden, int iNumeroCuenta, int idCliente)
        {
            ModelDataContext db = new ModelDataContext();
            List<DetalleCuenta> detalles = (from n in db.DetalleCuenta where n.IdOrden.Equals(sCodigoOrden) && n.NumeroCuenta.Equals(iNumeroCuenta) select n).ToList();

            foreach (var item in detalles)
            {
                db.DetalleCuenta.DeleteOnSubmit(item);
            }

            Cuenta cuenta = (from n in db.Cuenta where n.IdOrden.Equals(sCodigoOrden) && n.NumeroCuenta.Equals(iNumeroCuenta) && n.IdCliente.Equals(idCliente) select n).FirstOrDefault();

            db.Cuenta.DeleteOnSubmit(cuenta);

            db.SubmitChanges();
        }
   }
}
